package com.woniu.shops.loginInterceptor;

import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import com.alibaba.druid.util.StringUtils;
import com.woniu.common.constans.Constants;
import com.woniu.common.pojo.Shops;
import com.woniu.common.utils.TokenUtil;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Array;
import java.util.ArrayList;
import java.util.List;

@Component
public class LoginInterceptors implements HandlerInterceptor {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;



    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        // 从请求头中获取 token
        ArrayList<String > list = new ArrayList<>();
        list.add("user");
        list.add("Types");
        Shops obj = TokenUtil.getObj(request, Shops.class);
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);
        if(obj == null){
            System.out.println(0);
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
        String token = request.getHeader(Constants.TOKEN);
        // 检查 token 是否存在
        if (StringUtils.isEmpty(token) || token == null || "".equals(token)) {
            // 如果 token 不存在，重定向到登录页面
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
        for (String s : list) {
            if(s.contains(requestURI)){
                if(s.equals("/user/login")){
                    return true;
                }
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return false;
            }
        }


        // 校验 token
        try {
            Shops obj1 = TokenUtil.getObj(request, Shops.class);
            JWT jwt = JWTUtil.parseToken(token);
            String sname = jwt.getPayload("sname").toString();
            // 校验 token 是否合法
            boolean verify = JWTUtil.verify(token, sname.getBytes());
            if (!verify) {
                // 如果 token 不合法，重定向到登录页面
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return false;
            }
            // 校验 Redis 中的 token 是否一致
            String tokenInRedis = (String) redisTemplate.opsForValue().get(Constants.TOKEN);
            if (!StringUtils.equals(token, tokenInRedis)) {
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return false;
            }else {
               return true;
            }
            // 如果所有校验都通过，返回 true 继续请求
        } catch (Exception e) {
            // 如果解析或验证 token 失败，重定向到登录页面
            System.out.println(3);
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
    }
}